with ($ns("mx.controls"))
{
    /**
     * 为以 JQuery 对象为容器的控件提供基类。
     * @abstract
     * @param [$p_container] 一个 JQuery 对象，或 JQuery 选择器对应的字符串（如“#container”），或 HTML DOM 元素。如果为空则为一个 DIV 元素。 
     * @param [p_options] 一个 JSON 对象。定义该类字段和事件的初始值。
     */
    mx.controls.JQControl = function($p_container, p_options)
    {
        var me = new EventDispatcher();
        var base = {};
        
        /**
         * @ignore
         */
        me._initOptions = null;
        
        /**
         * 获取该控件的父窗体对象，通常是一个继承自 {@link mx.windows.Window} 类的实例。
         */
        me.owner = null;
        
        /**
         * 获取一个值，表示该控件是否已经初始化（是否已执行 {@link init} 方法）。如果该值为 true，则表示已初始化；反之则没有初始化。
         */
        me.initialized = false;
        
        /**
         * 获取控件是否可以对用户交互作出响应。如果该值为 true，则表示控件可以对用户交互作出响应；反之则不能。
         * 请使用 {@link setEnabled} 方法设置该字段的值。
         * @default true
         */
        me.enabled = true;
        
        /**
         * 获取控件是否为可见状态。如果该值为 true，则表示控件可见；反之则不可见。
         * 请使用 {@link setVisible} 方法设置该字段的值。
         * @default true
         */
        me.visible = true;
        
        /**
         * 获取控件的宽度，可以是数字（如 500）、字符串（如“500px”或“50%”）。      
         * 请使用 {@link setWidth} 方法设置该字段的值。
         * @default auto
         */    
        me.width = "auto";
        
        /**
         * 获取控件的高度，可以是数字（如 500）、字符串（如“500px”或“50%”）。
         * 请使用 {@link setHeight} 方法设置该字段的值。
         * @default auto
         */
        me.height = "auto";
        
        /**
         * 获取一个表示控件的边框样式的值。如“1px solid red”，表示边框的样式为 1 像素红色的实线。
         * 请使用 {@link setBorder} 方法设置该字段的值。
         */
        me.border = null;
        
        /**
         * 获取控件的内边距。如“4px”表示上下左右的内边距均为 4 像素；
         * “4px 2px 3px 1px”则表示上边距为 4 像素，右边距为 2 像素，下边距为 3 像素，左边距为 1 像素。
         * 请使用 {@link setBorder} 方法设置该字段的值。
         */
        me.padding = null;
        
        /**
         * @ignore
         */
        me.localeSources = "mx";
        
        /**
         * 初始化控件。
         */
        me.init = function()
        {
        	me.initialized = true;
        	
            if (typeof(me._initOptions) != "undefined" && me._initOptions != null)
            {
                for (var name in me._initOptions)
                {
                    if (!name)
                    {
                        continue;
                    }
                    if (typeof(me._initOptions[name]) == "function" && name.startsWith("on") && (me[name] == null || (me[name] != null && me[name].constructor == Event)))
                    {
                        me.bind(name, me._initOptions[name]);
                        me._initOptions[name] = null;
                        delete me._initOptions[name];
                    }
                }
                $.extend(me, me._initOptions);
            }
            
            if (me.width != "auto")
            {
                me.setWidth(me.width);
            }
            if (me.height != "auto")
            {
                me.setHeight(me.height);
            }
            if (!me.enabled)
            {
                me.setEnabled(me.enabled);
            }
            if (!me.visible)
            {
                me.setVisible(me.visible);
            }
            if (me.border != null)  
            {
                me.setBorder(me.border);
            }
            if (me.padding != null)
        	{
            	me.setPadding(me.padding);
        	}
        };
        
        /**
         * 设置 {@link enabled} 字段的值。
         */
        me.setEnabled = function(p_enabled)
        {          
            if (p_enabled == null)
            {
                p_enabled = true;
            }
            me.enabled = p_enabled;  
            me.$container.toggleClass("disabled", !p_enabled);          
        };
            
        /**
         * 设置 {@link visible} 字段的值。
         */
        me.setVisible = function(p_visible)
        {           
            if (p_visible == null)
            {
                p_visible = true;
            }
            me.visible = p_visible;         
            p_visible ? me.$container.css("display", "") : me.$container.css("display", "none");            
        };
        
        /**
         * 设置 {@link width} 字段的值。
         */
        me.setWidth = function(p_width)
        {
            if (typeof(me.width) != "undefined")
            {
                me.width = p_width;
            }
            me.$container.css("width", p_width);
        };
        
        /**
         * 设置 {@link height} 字段的值。
         */
        me.setHeight = function(p_height)
        {
            if (typeof(me.height) != "undefined")
            {
                me.height = p_height;
            }
            me.$container.css("height", p_height);
        };
        
        /**
         * 设置 {@link padding} 字段的值。
         */
        me.setPadding = function(p_padding)
        {
        	me.padding = p_padding;
        	me.$container.css("padding", p_padding);
        };
        
        /**
         * 设置 {@link border} 字段的值。
         */
        me.setBorder = function(p_borders)
        {                           
            var option = {};    
            if (p_borders == null)          
            {
                p_borders = null;
                option.border = "transparent";
            }
            else if (typeof(p_borders) == "object") 
            {
                if (p_borders.border != "undefiend")                    
                {
                    option.border = p_borders.border;                   
                }
            }
            else if(typeof(p_borders) == "string")          
            {
                option.border = p_borders;
            }
            
            me.border = p_borders;
                        
            if (p_borders == null)          
            {                           
                me.$container.css("border-color", option.border);           
    
                if (me.$input != null)              
                {                   
                    me.$input.css("border-color", option.border);                   
                }

                if (me.$("#inputContainer").length > 0)             
                {                                                                                   
                    me.$("#inputContainer").css("border-color", option.border);
                }
            }
            else            
            {
                me.$container.css(option);
            }       
        };
        
        
        /**
         * 返回一个 Boolean 值，该值表示控件的容器中是否包含该 JQuery 对象。
         * @param $p_target 一个 JQuery 对象，或 JQuery 选择器对应的字符串（如“#container”），或 HTML DOM 元素。
         */
        me.contains = function($p_target)
        {
            var $target = me.$wrap($p_target);
            return $.contains(me.$container.get(0), $target.get(0));
        };
        
        /**
         * 显示控件。
         */
        me.show = function()
        {
            me.setVisible(true);
        };
        
        /**
         * 隐藏控件。
         */
        me.hide = function()
        {
            me.setVisible(false);
        };
        
        /**
         * 设置控件的宽度和高度。
         * @param p_width 一个数字（如 500），或字符串（如“500px”或“50%”）。表示控件的宽度。参见 {@link width} 字段。
         * @param p_height 一个数字（如 500），或字符串（如“500px”或“50%”）。表示控件的高度。参见 {@link height} 字段。
         */
        me.resizeTo = function(p_width, p_height)
        {
            me.setWidth(p_width);
            me.setHeight(p_height);
        };
  
        /**
         * 设置控件的位置。
         * @param p_left 一个数字（如 100）或字符串（如“100px”、“50%”）。表示容器左边缘相对于父容器左边缘的距离。
         * @param p_top 一个数字（如 100）或字符串（如“100px”、“50%”）。表示容器上边缘相对于父容器上边缘的距离。
         */
        me.moveTo = function(p_left, p_top)
        {
            if (typeof(me.left) != "undefined")
            {
                me.left = p_left;
            }
            if (typeof(me.top) != "undefined")
            {
                me.top = p_top;
            }
            me.$container.css("left", p_left);
            me.$container.css("top", p_top);
        }; 
        
        /**
         * 请参见 {@link mx.windows.Window.setLoading} 方法。该方法仅在 {@link owner} 字段不为空时有效。
         */
        me.setLoading = function(p_loading)
        {
            if (me.owner != null)
            {
                me.owner.setLoading(p_loading);
            }
        };
        
        /**
         * 请参见 {@link mx.windows.Window.setBusy} 方法。该方法仅在 {@link owner} 字段不为空时有效。
         */
        me.setBusy = function(p_busy)
        {
            if (me.owner != null)
            {
                me.owner.setBusy(p_busy);
            }
        };
        
        /**
         * 请参见 {@link mx.windows.Window.indicate} 方法或 {@link mx.windows.WindowManagerClass.indicate} 方法。
         * 当 {@link owner} 字段不为空时使用前者，反之则使用后者。
         */
        me.indicate = function(p_type, p_message, p_options)
        {
            if (me.owner != null)
            {
                return me.owner.indicate(p_type, p_message, p_options);
            }
            else
            {
                return mx.windows.WindowManager.indicate(p_type, p_message, p_options);
            }
        };
        
        
        /**
         * 该方法与 me.$container.find(p_expression) 等同。
         */
        me.$ = function(p_expression)
        {
            var result = null;
            if (me.$container != null)
            {
                result = me.$container.find(p_expression);
            }
            else
            {
                result = $(p_expression);
            }
            return result;
        };
        
        /**
         * @ignore
         */
        me.$msg = function(p_key, p_args)
        {
            return $msg(me.localeSources, p_key, p_args);
        };
        
        /**
         * 返回一个 JQuery 对象。
         * @param [p_obj=me.$container] 一个 JQuery 对象，或继承自 JQControl 的控件，或字符串，或 HTML DOM 元素。如果参数为 JQuery 对象，则返回本身；如果参数为继承自 JQControl 的控件，则返回控件的 $container 对象；如果参数为字符串，则返回以字符串为选择器的 JQuery 对象；如果参数为空，则返回控件本身的 $container 对象。
         */
        me.$wrap = function(p_obj)
        {
            var $result = null;
            if (p_obj == null)
            {
                $result = me.$container;
            }
            else if (typeof(p_obj.jquery) != "undefined")
            {
                $result = p_obj;
            }
            else if (typeof(p_obj.$container) != "undefined")
            {
                $result = p_obj.$container;
            }
            else
            {
                if (typeof(p_obj) == "string")
                {
                    if (me.$container == null)
                    {
                        $result = $(p_obj);
                    }
                    else
                    {
                        $result = me.$(p_obj);
                    }
                }
                else
                {
                    $result = $(p_obj);
                }
            }
            if ($result == null || $result.length == 0)
            {
                throw new Error("Nothing is selected by the jQuery expression '" + p_obj + "'." + ((typeof(p_obj) == "string" && !p_obj.startsWith("#")) ? " Missing the '#'?" : ""));
            }
            return $result;
        };
        
        
        
        var $container = null;
        var options = null;
        if ($p_container == null && p_options == null)
        {
            
        }
        else if ($isPlainObject($p_container) && typeof($p_container.jquery) == "undefined")
        {
            $container = null;
            options = $p_container;
        }
        else
        {
            $container = $p_container != null ? $p_container : null;
            options = p_options != null ? p_options : null;
        }
        
        /**
         * 获取控件容器的 JQuery 对象。
         */
        me.$container = me.$wrap($container != null ? $container : "<div/>");
        
        if ($mx.debugMode)
        {
            me.$container.data("control", me);
        }
        
        if (options != null)
        {
            me._initOptions = options;
        }
        else
        {
            me._initOptions = null;
        }
        
        
        
        
        
        
        
        base.dispose = me.dispose;
        me.dispose = function()
        {
            if (me.$container != null)
            {
                me.$container.data("control", null);
                try
                {
                    me.$container.remove();
                }
                catch (e)
                {
                    
                }
            }
            delete me.$container;
            
            base.dispose();
        }
        
        return me;
    };
};